iT邦幫忙

2022 iThome 鐵人賽

DAY 23
0

簡述

Retrofit 是一套由 Square 所開發維護的函式庫,並且基於 okhttp 以及遵循 Restful API,讓我們在進行一些網路操作的工作時,能夠提高效率。

特色

  1. 支持多種的數據解析及序列化格式(EX:Json、Gson、、XML等)
  2. 支持同步和異步網絡請求
  3. 通過註解來進行網絡請求
  4. 對Rxjava的高度支持

比較

相較於比較常見的Volley或是AsyncTask都是比要有效率的,這也是retrofit的強大之處。

gradle

//retrofit
implementation 'com.squareup.retrofit2:retrofit:2.6.0'
//retrofit gson轉換(版本需與retrofit一致)
implementation 'com.squareup.retrofit2:converter-gson:2.6.0'

權限

//網路權限
<uses-permission android:name="android.permission.INTERNET"/>

流程

測試網址:https://jsonplaceholder.typicode.com/posts

  1. 建立Http請求(interface)
 //網址後的內容,ex:https://jsonplaceholder.typicode.com/posts,這裡輸入的是BaseUrl以外的位址(posts)
@GET("posts")  
Call<List<DataFromApi>> getPosts();
//傳入參數@Query(方法GET)
@GET("posts")
//Query數據在URL上
Call<List<Albums>> getPosts(
        @Query("userId") int userId,
        @Query("_sort") String sort,
        @Query("_order") String order
);
//傳入參數方式@Body(方法POST)
@POST ("posts")// 用@Body表示要傳送Body資料
Call<DataFromApi> createPost(@Body DataFromApi post);
​

@GET postman 示範


@Query postman 示範


@POST postman 示範



2. 建立RetrofitManager

public class RetrofitManager {
    private static RetrofitManager mInstance = new RetrofitManager();
    private Retrofit retrofit;
    public MyAPIService myAPIService;
    public RetrofitManager(){
        retrofit = new Retrofit.Builder()
                //api的URL,注意最後須要/,不然會報錯
                .baseUrl("https://jsonplaceholder.typicode.com/")
                //轉換成Gson的工具
                .addConverterFactory(GsonConverterFactory.create())
                //建立
                .build();
​
        //將Http相關請求的介面與Retrofit做連結
        myAPIService = retrofit.create(MyAPIService.class);
    }
​
    public static RetrofitManager getInstance(){
        return mInstance;
    }
    public MyAPIService getService(){
        return myAPIService ;
    }
}

retrofit的建立加入Gson轉換、api的BaeUrl以及與介面(http請求)綁定。

3. Call Api (GET/POST)

//獲得所有Post資料
        RetrofitManager.getInstance().getService().getPosts().enqueue(new Callback<List<DataFromApi>>() {
            @Override
            public void onResponse(Call<List<DataFromApi>> call, Response<List<DataFromApi>> response) {
                StringBuilder result = new StringBuilder();
                if(!response.isSuccessful()){
                    result_txt.setText(response.code());
                    return;
                }
                List<DataFromApi> responseBody = response.body();
​
                for(DataFromApi dataFromApi:responseBody){
                    result.append("{").append("\n");
                    //獲取資料,並整理
                    result.append("ID: ").append(dataFromApi.getId()).append("\n") ;
                    result.append("User ID: ").append(dataFromApi.getUserId()).append("\n") ;
                    result.append("Title: ").append(dataFromApi.getTitle()).append("\n") ;
                    result.append("Text: ").append(dataFromApi.getText()).append("\n") ;
​
                    result.append("},").append("\n");
                }
​
                result_txt.setText(result.toString());
                Log.d("result", "onResponse: "+result);
            }
​
            @Override
            public void onFailure(Call<List<DataFromApi>> call, Throwable t) {
​
            }
        });


註:onResponse()、onFailure()都是在主線程執行的。可以用來直接更新UI等操作,這也是Retrofit一大特色喔,可以回去我昨天的okhttp比較看看。

結果


與Okhttp結合

gradle

...
//okhttp3
implementation 'com.squareup.okhttp3:okhttp:4.0.1'
//攔截器
implementation 'com.squareup.okhttp3:logging-interceptor:4.9.1'

範例

先上程式碼

//OkHttpClient
OkHttpClient okHttpClient = new OkHttpClient().newBuilder()
                .connectTimeout(30, TimeUnit.SECONDS)   // 設置連線Timeout
                .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BASIC))
                .build();
​
Retrofit retrofit = new Retrofit.Builder()
                .baseUrl("https://jsonplaceholder.typicode.com/")
                .addConverterFactory(GsonConverterFactory.create())
                //新增OkHttpClient
                .client(okHttpClient)
                .build();
​
myAPIService = retrofit.create(MyAPIService.class);


也就是在原本建立Retrofit的地方,加入昨天建立Okhttp的方式,最後並在創立Retrofit時加入OkHttpClient,這樣一來就能看到OkHttpClient的優點,讓我們方便觀察狀態了,是不是很棒呢!~

結果



上一篇
精華筆記 Day22 - RxJava(2)
下一篇
精華筆記 Day 24 -Room
系列文
android studio 30天 精華筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言